#ifndef _PROTOCOL_APP_H_
#define _PROTOCOL_APP_H_

#include "protocol_api.h"

// 事件允许重发次数
#define MESSAGE_ALLPWED_NUMBER_OF_SEND                 3
// 重启发送间隔时间 - 5s
#define MESSAGE_RESTART_SENDING_INTERVAL               5000

// 间隔查询网络状态时间
#define PROTOCOL_INTERVAL_QUERY_NETWORK_STATUS_TIME    500

/**
 * @brief 定义数据源
 *
 */
typedef enum
{
  SOURCE_HOST_USB,             // 主机USB
  SOURCE_QRCODE_SCANF,         // 二维码扫描
  SOURCE_MOBILE_CLIENT,        // 手机客户端控制
  SOURCE_NETWORK_TRANSMISSION, // 网络传输
} DataSource_t;

/**
 * @brief 报文响应状态
 *
 */
typedef enum
{
  MESSAGE_EXECUTE_IDLE,           // 消息执行空闲
  MESSAGE_WAIT_HOST_ACK,          // 等待主机确认
  MESSAGE_RESPONSES_TIMEOUT,      // 响应超时
  MESSAGE_COMPLETION_FAILURE,     // 执行完成失败
  MESSAGE_COMPLETION_EXECUTION,   // 执行完成
  MESSAGE_RESPONSES_TRANSMITTER,  // 消息响应发送
  MESSAGE_WAIT_FOR_NETWORK_READY, // 等待网络就绪
} MessageResponseStatus_t;

/**
 * @brief 报文发送状态
 *
 */
typedef enum
{
  MESSAGE_SEND_IDLE,                // 消息发送空闲
  MESSAGE_SEND_COMPLETION,          // 发送完成
  MESSAGE_SEND_HOST_NO_ACK,         // 主机不应答
  MESSAGE_SEND_NETWORK_ATT_FAILURE, // 网络附着失败
} MessageSendStatus_t;

/**
 * @brief 报文发送状态位
 *
 */
typedef struct
{
  uint8_t NumberOfSend;                   // 发送次数
  MessageSendStatus_t SendStatus;         // 发送状态
  MessageResponseStatus_t ResponseStatus; // 发送步骤
} MessagingTaskStatusBit_t;

/**
 * @brief 向服务器发送心跳
 *
 * @return bool - 发送结果(true:成功  false:失败)
 */
extern bool ProtocolSendHeartbeatToHost(void);

/**
 * @brief 主动推送心跳事件
 *
 * @return bool - 发送结果(true:成功  false:失败)
 */
extern bool ProtocolActivePushHeartbeatToHost(void);

/**
 * @brief 上报在线注册结果
 *
 * @param pInformationIn - 密钥信息
 * @param Result         - 注册结果
 * @return bool          - 上报结果(true:成功  false:失败)
 */
extern bool ProtocolUploadOnlineRegisterResult(ReportCardholderInformationFormat_t *pInformationIn, uint8_t Result);

/**
 * @brief 向服务器上报日志信息
 *
 * @param LogId     - 日志ID
 * @param EventType - 卡片序列号
 * @param Parameter - 鉴权结果
 * @param pValueIn  - 附带参数
 * @return bool     - 上报结果(true:成功  false:失败)
 */
extern bool ProtocolUploadLogEventToHost(uint16_t LogId, uint8_t EventType, uint8_t Parameter, const uint8_t *pValueIn);

/**
 * @brief 向主机上报密钥信息
 *
 * @param KeyType     - 密钥类型
 * @param pKeyValueIn - 密钥
 * @param NumberOfKey - 密钥长度
 * @return bool       - 上报结果(true:成功  false:失败)
 */
extern bool ProtocolUploadKeyValueToHost(uint8_t KeyType, const void *pKeyValueIn, uint8_t NumberOfKey);

/**
 * @brief 解析报文
 *
 * @param DataSource - 数据来源
 * @param pMessageIn - 输入待解析报文
 * @param SizeIn     - 输入报文长度
 */
extern void ProtocolPraseMessage(uint8_t DataSource, const uint8_t *pMessageIn, const uint16_t SizeIn);

/**
 * @brief 重置消息队列
 *
 */
extern void ProtocolResetMessageQueue(void);

/**
 * @brief 协议解析功能初始化
 *
 */
extern void ProtocolConfiguration(void);

#endif
